from rag_test.legal_embeddings import text_embeddings
from rag_test.milvus_writer import write_to_milvus
from rag_test.preprocess_labor_law import preprocess_labor_law
from rag_test.structure_metadata import structure_labor_law_metadata
from utils.PDFLawReader import PDFLawReader


def load_file(file_path):
    pdf_reader = PDFLawReader(file_path)
    # 2. 打开文档
    pdf_reader.open_document()

    # 3. 读取文档基本信息
    doc_info = pdf_reader.get_document_info()
    full_text = pdf_reader.extract_full_text()
    #print("\n=== 文档全文 ===", full_text)
    return full_text


import re
from typing import List, Dict


def split_labor_law_articles(law_text: str) -> List[Dict[str, str]]:
    """
    按条款切分《劳动合同法》文本，返回结构化法条列表
    :param law_text: 已读取的《劳动合同法》完整文本（PDF内容提取后）
    :return: 结构化列表，每个元素含"chapter"（章节）、"article_num"（法条编号）、"content"（法条内容）
    """
    # 1. 预处理文本：去除多余空行、规整格式（适配PDF提取可能的换行混乱）
    processed_text = re.sub(r'\n+', '\n', law_text.strip())  # 多个空行合并为一个
    processed_text = re.sub(r'([一二三四五六七八九十])\s+', r'\1', processed_text)  # 去除“第一章  总则”中的多余空格

    # 2. 定义关键正则：匹配章节标题（如“第一章 总则”“第五章 特别规定 第一节 集体合同”）和法条编号（如“第一条”“第五十七条”）
    # 章节标题正则：匹配“第X章 标题”或“第X章 标题 第X节 标题”（适配“特别规定”下的三级结构）
    chapter_pattern = re.compile(
        r'^(第[一二三四五六七八九十]+章\s+.+?)(?=\n第[一二三四五六七八九十]+章|\n第[零一二三四五六七八九十百]+条|$)',
        re.MULTILINE | re.DOTALL)
    # 法条编号正则：匹配“第X条”（X为数字，如“第一条”“第一百条”，覆盖本法所有87个法条）
    article_num_pattern = re.compile(r'^(第[零一二三四五六七八九十百]+条)', re.MULTILINE)

    # 3. 提取所有章节及对应内容（确保法条归属正确章节）
    chapters = []
    # 先找到所有章节标题的位置
    chapter_matches = list(chapter_pattern.finditer(processed_text))
    total_length = len(processed_text)

    for i, match in enumerate(chapter_matches):
        chapter_name = match.group(1).strip()  # 章节名称（如“第四章 劳动合同的解除和终止”）
        # 确定当前章节的内容范围（从当前章节标题到下一个章节标题，或到文本末尾）
        start_idx = match.end()
        if i < len(chapter_matches) - 1:
            end_idx = chapter_matches[i + 1].start()
        else:
            end_idx = total_length
        # 提取当前章节的完整内容（含该章节下所有法条）
        chapter_content = processed_text[start_idx:end_idx].strip()
        chapters.append({"name": chapter_name, "content": chapter_content})

    # 4. 按法条编号切分每个章节下的内容
    all_articles = []
    for chapter in chapters:
        chapter_name = chapter["name"]
        chapter_content = chapter["content"]

        # 找到当前章节下所有法条的编号位置
        article_matches = list(article_num_pattern.finditer(chapter_content))
        article_count = len(article_matches)

        for j, art_match in enumerate(article_matches):
            article_num = art_match.group(1).strip()  # 法条编号（如“第三十九条”）
            # 确定当前法条的内容范围（从当前法条编号到下一个法条编号，或到章节末尾）
            art_start = art_match.start()
            if j < article_count - 1:
                art_end = article_matches[j + 1].start()
            else:
                art_end = len(chapter_content)
            # 提取当前法条的完整内容（含编号后的所有文本，如分点、解释）
            article_content = chapter_content[art_start:art_end].strip()
            # 结构化存储（章节+编号+内容）
            all_articles.append({
                "chapter": chapter_name,
                "article_num": article_num,
                "content": article_content
            })

    return all_articles


if __name__ == '__main__':
    sample_labor_law_text = load_file("劳动合同法.pdf")
    # 执行切分
    split_articles = split_labor_law_articles(sample_labor_law_text)
    #print(split_articles)

    # 二次去操:数据预处理（清理 + 结构化）
    processed = preprocess_labor_law(split_articles)
    # print(processed)
    # for item in processed:
    #     print(f"ID: {item['id']}")
    #     print(f"法条编号: {item['metadata']['article_num_code']}")
    #     print(f"向量文本: {item['vector_text'][:100]}...\n")
    structured_data = structure_labor_law_metadata(processed)
    # 打印关键元数据字段
    # for item in structured_data:
    #     print(f"法条编号: {item['metadata']['article_num']}")
    #     print(f"法律主体: {item['metadata']['legal_elements']['subjects']}")
    #     print(f"适用场景: {item['metadata']['applicable_scenarios']}")
    #     print(f"检索标签: {item['metadata']['search_tags']}")
    #     print(f"条款项: {item['metadata']['clauses']}\n")
    embeddings = text_embeddings(structured_data)
    # print(f"生成向量数量：{len(embeddings)}")
    # print(f"第一条向量维度：{len(embeddings[0])}")
    # print(f"向量示例（前5位）：{embeddings[0][:5]}")

    write_to_milvus(structured_data, embeddings)
